package com.quantoeugasto.servico;

import java.io.InputStream;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.Scanner;
import java.util.StringTokenizer;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.quantoeugasto.entidade.Ano;
import com.quantoeugasto.entidade.Categoria;
import com.quantoeugasto.entidade.Gasto;
import com.quantoeugasto.entidade.Mes;
import com.quantoeugasto.entidade.Usuario;
import com.quantoeugasto.persistencia.GastoDAO;

@Service
public class BackupService {
	
	@Autowired
	private GastoDAO gastoDAO;
	
	@Autowired
	private GastoService gastoService;
	
	@Autowired
	private AnoService anoService;
	
	@Autowired
	private CategoriaService categoriaService;

	@Transactional(propagation = Propagation.SUPPORTS)
	public String gerarBackup (Usuario usuario){
		List<Gasto> gastos =  this.gastoDAO.findGastos(usuario);
		
		StringBuffer buffer = new StringBuffer();
		
		for (Gasto gasto : gastos) {
			buffer.append(gasto.toCsv() + "\n");
		}
		
		return buffer.toString();
	}
	
	@Transactional(propagation = Propagation.REQUIRED)
	public void restaurarBackup(InputStream in, Usuario usuario) throws Exception {
		Scanner s = new Scanner(in);
		
		Gasto gastoParcelado = null;
		
		while(s.hasNext()) {
			String registro = s.nextLine();
			StringTokenizer tokenizer = new StringTokenizer(registro, ",");
			
			if (tokenizer.countTokens() != 9) {
				throw new Exception("Registro inválido! - " + registro);
			}
			
			Long idGasto = new Long(tokenizer.nextToken());
			Gasto gasto = new Gasto();
			gasto.setId(idGasto);
			
			if (this.gastoService.consultar(gasto) == null) {
				gasto.setId(null);
				DateFormat format = new SimpleDateFormat("dd/mm/yyyy hh:mm:ss");
				gasto.setDescricao(tokenizer.nextToken());
				gasto.setValor(new Double(tokenizer.nextToken()));
				gasto.setData(format.parse(tokenizer.nextToken()));
				gasto.setMes(Mes.getByCodigo(Integer.parseInt(tokenizer.nextToken())));
				
				Integer anoNum = new Integer(tokenizer.nextToken());
				Ano ano = this.anoService.findAno(anoNum, usuario);
				if (ano == null) {
					ano = new Ano(anoNum, usuario);
					this.anoService.inserir(ano);
					ano = this.anoService.findAno(anoNum, usuario);
				}
				gasto.setAno(ano);
				
				boolean possuiDemaisParcelas = tokenizer.nextToken().equals("S");
				
				boolean possuiPrimeiraParcela = tokenizer.nextElement().equals("S");
				
				if (possuiPrimeiraParcela) {
					gasto.setPrimeiraParcela(gastoParcelado);
				}
				
				String nomeCategoria = tokenizer.nextToken();
				Categoria categoria = this.categoriaService.findCategoria(nomeCategoria, usuario); 
				if (categoria == null) {
					categoria = new Categoria(nomeCategoria, usuario);
					this.categoriaService.inserir(categoria);
					categoria = this.categoriaService.findCategoria(nomeCategoria, usuario);
				}
				
				gasto.setCategoria(categoria);
				this.gastoService.inserir(gasto);
				System.out.println("Gasto " + gasto.getDescricao() + " salvo!");
				
				if (possuiDemaisParcelas) {
					gastoParcelado = gasto;
				}
			}
		}
	}

}
